/**
 * 颜色处理工具函数
 * 提供颜色转换、亮度调整等功能
 */

/**
 * 将颜色转换为 RGB 格式
 * @param color 颜色值（支持 #hex, rgb, rgba）
 * @returns RGB 对象 {r, g, b}
 */
export function colorToRgb(color) {
  let r, g, b

  // 处理 #hex 格式
  if (color.startsWith('#')) {
    const hex = color.replace('#', '')
    if (hex.length === 3) {
      r = parseInt(hex[0] + hex[0], 16)
      g = parseInt(hex[1] + hex[1], 16)
      b = parseInt(hex[2] + hex[2], 16)
    } else if (hex.length === 6) {
      r = parseInt(hex.substring(0, 2), 16)
      g = parseInt(hex.substring(2, 4), 16)
      b = parseInt(hex.substring(4, 6), 16)
    } else {
      return null
    }
  }
  // 处理 rgb/rgba 格式
  else if (color.startsWith('rgb')) {
    const match = color.match(/(\d+),\s*(\d+),\s*(\d+)/)
    if (match) {
      r = parseInt(match[1])
      g = parseInt(match[2])
      b = parseInt(match[3])
    } else {
      return null
    }
  } else {
    return null
  }

  return { r, g, b }
}

/**
 * 将 RGB 转换为十六进制
 * @param r 红色值 (0-255)
 * @param g 绿色值 (0-255)
 * @param b 蓝色值 (0-255)
 * @returns 十六进制颜色值
 */
export function rgbToHex(r, g, b) {
  return '#' + [r, g, b].map(x => {
    const hex = Math.round(x).toString(16)
    return hex.length === 1 ? '0' + hex : hex
  }).join('')
}

/**
 * 将 RGB 转换为 HSL
 * @param r 红色值 (0-255)
 * @param g 绿色值 (0-255)
 * @param b 蓝色值 (0-255)
 * @returns HSL 对象 {h, s, l}
 */
export function rgbToHsl(r, g, b) {
  r /= 255
  g /= 255
  b /= 255

  const max = Math.max(r, g, b)
  const min = Math.min(r, g, b)
  let h, s, l

  l = (max + min) / 2

  if (max === min) {
    h = s = 0 // 灰色
  } else {
    const d = max - min
    s = l > 0.5 ? d / (2 - max - min) : d / (max + min)

    switch (max) {
      case r: h = (g - b) / d + (g < b ? 6 : 0); break
      case g: h = (b - r) / d + 2; break
      case b: h = (r - g) / d + 4; break
    }
    h /= 6
  }

  return { h, s, l }
}

/**
 * 将 HSL 转换为 RGB
 * @param h 色相 (0-1)
 * @param s 饱和度 (0-1)
 * @param l 亮度 (0-1)
 * @returns RGB 对象 {r, g, b}
 */
export function hslToRgb(h, s, l) {
  let r, g, b

  if (s === 0) {
    r = g = b = l // 灰色
  } else {
    const hue2rgb = (p, q, t) => {
      if (t < 0) t += 1
      if (t > 1) t -= 1
      if (t < 1/6) return p + (q - p) * 6 * t
      if (t < 1/2) return q
      if (t < 2/3) return p + (q - p) * (2/3 - t) * 6
      return p
    }

    const q = l < 0.5 ? l * (1 + s) : l + s - l * s
    const p = 2 * l - q

    r = hue2rgb(p, q, h + 1/3)
    g = hue2rgb(p, q, h)
    b = hue2rgb(p, q, h - 1/3)
  }

  return {
    r: Math.round(r * 255),
    g: Math.round(g * 255),
    b: Math.round(b * 255)
  }
}

/**
 * 使颜色变亮
 * @param color 原始颜色
 * @param amount 变亮程度 (0-1)
 * @returns 变亮后的颜色
 */
export function lightenColor(color, amount) {
  const rgb = colorToRgb(color)
  if (!rgb) return color

  const hsl = rgbToHsl(rgb.r, rgb.g, rgb.b)
  // 使用乘法而不是加法，避免过度变亮
  hsl.l = Math.min(1, hsl.l + (1 - hsl.l) * amount)
  
  const newRgb = hslToRgb(hsl.h, hsl.s, hsl.l)
  return rgbToHex(newRgb.r, newRgb.g, newRgb.b)
}

/**
 * 使颜色变暗
 * @param color 原始颜色
 * @param amount 变暗程度 (0-1)
 * @returns 变暗后的颜色
 */
export function darkenColor(color, amount) {
  const rgb = colorToRgb(color)
  if (!rgb) return color

  const hsl = rgbToHsl(rgb.r, rgb.g, rgb.b)
  hsl.l = Math.max(0, hsl.l - amount)
  
  const newRgb = hslToRgb(hsl.h, hsl.s, hsl.l)
  return rgbToHex(newRgb.r, newRgb.g, newRgb.b)
}

/**
 * 计算颜色的亮度 (0-1)
 * @param color 颜色值
 * @returns 亮度值 (0-1)
 */
export function getLuminance(color) {
  const rgb = colorToRgb(color)
  if (!rgb) return 0.5

  // 转换为 sRGB
  const r = rgb.r / 255
  const g = rgb.g / 255
  const b = rgb.b / 255

  // 应用 gamma 校正
  const rs = r <= 0.03928 ? r / 12.92 : Math.pow((r + 0.055) / 1.055, 2.4)
  const gs = g <= 0.03928 ? g / 12.92 : Math.pow((g + 0.055) / 1.055, 2.4)
  const bs = b <= 0.03928 ? b / 12.92 : Math.pow((b + 0.055) / 1.055, 2.4)

  // 计算相对亮度
  return 0.2126 * rs + 0.7152 * gs + 0.0722 * bs
}

/**
 * 生成主题颜色相关的变量
 * @param primaryColor 主色调
 * @returns 主题颜色配置对象
 */
export function generateThemeColors(primaryColor) {
  return {
    primary: primaryColor,
    light3: lightenColor(primaryColor, 0.3),
    light5: lightenColor(primaryColor, 0.5),
    light7: lightenColor(primaryColor, 0.7),
    light9: lightenColor(primaryColor, 0.9),
    dark2: darkenColor(primaryColor, 0.2),
    plainText: primaryColor
  }
}

